<?php

/**
 * 客户相关
 */

namespace app\admin\controller;

use PhpOffice\PhpWord\IOFactory;
use think\Db;
use think\response\Json;
use PHPExcel;
use PHPExcel_IOFactory;

class Client extends BaseController
{
    /**
     * 列表视图
     */
    public function index()
    {
        // 获取参数
        $params = input("get.");
        $industry = db("industry")->where(['status' => 1])->order("orders asc,create_time desc")->select();
        $this->assign("industry", $industry);
        $this->assign("module_id", $params["module_id"]);
        return view();
    }

    /**
     * 获取列表信息
     */
    public function getList()
    {
        // 获取参数
        $params = input("get.");
        $page = isset($params["page"]) ? $params["page"] : 1;
        $limit = isset($params["limit"]) ? $params["limit"] : 30;
        $offset = ($page - 1) * $limit;
        // 定义查询条件
        $where = [
            "status" => 1,
            "module_id" => $params["module_id"]
        ];
        $wheres = [];
        if (isset($params["industry_id"]) && $params["industry_id"] > 0) {
            $wheres[] = ["industry_id", '=', $params["industry_id"]];
        }
        if (isset($params["class_id"]) && $params["class_id"] > 0) {
            $wheres[] = ["class_id", '=', $params["class_id"]];
        }
        if (isset($params["sale_state"]) && $params["sale_state"] > 0) {
            $wheres[] = ["sale_state", '=', $params["sale_state"]];
        }
        if (isset($params["search"]) && !empty($params["search"])) {
            $wheres[] = ["title|tel|address|web_url", 'like', '%'.$params["search"].'%'];
        }
        // 定义查询字段
        $fields = "*,(select title from w_industry where w_industry.id=industry_id) as industry_title,(select title from w_class where w_class.id=class_id) as class_title";
        // 统计查询数据数量
        $count = db("client")->where($where)->where($wheres)->count();
        // 查询数据
        $info = db("client")->where($where)->where($wheres)->field($fields)->order("create_time desc")->limit($offset, $limit)->select();
        // 定义返回数据
        $arr = ["code" => 0, "msg" => 'true', "data" => $info, "count" => $count];
        return json($arr);
    }

    /**
     * 添加视图
     */
    public function add()
    {
        // 获取参数
        $params = input("get.");
        $industry = db("industry")->where(['status' => 1])->order("orders asc,create_time desc")->select();
        $this->assign("industry", $industry);
        $this->assign("module_id", $params["module_id"]);
        return view();
    }

    /**
     * 添加视图
     */
    public function files()
    {
        // 获取参数
        $params = input("get.");
        $industry = db("industry")->where(['status' => 1])->order("orders asc,create_time desc")->select();
        $this->assign("industry", $industry);
        $this->assign("module_id", $params["module_id"]);
        return view();
    }

    /**
     * 编辑视图
     */
    public function edit()
    {
        // 获取参数
        $params = input("get.");
        $id = isset($params["id"]) ? $params["id"] : '';
        // 定义数据
        $info = [];
        // 验证参数
        if (isset($params["id"])) {
            // 查询数据
            $info = db("client")->where("id", "=", $params["id"])->find();
        }
        $industry = db("industry")->where(['status' => 1])->order("orders asc,create_time desc")->select();
        $class = db("class")->where(['status' => 1, 'industry_id' => $info['industry_id']])->order("orders asc,create_time desc")->select();
        $this->assign("class", $class);
        $this->assign("industry", $industry);
        $this->assign("info", $info);
        $this->assign("id", $id);
        return view();
    }

    /**
     * 保存信息
     */
    public function save()
    {
        // 获取参数
        $params = input("post.");
        unset($params["file"]);
        // 验证参数
        if (!empty($params["id"])) {
            // 更新数据
            $params["update_time"] = date("Y-m-d H:i:s");
            db("client")->update($params);
        } else {
            // 释放参数ID
            unset($params["id"]);
            // 保存数据
            $params["create_time"] = date("Y-m-d H:i:s");
            db("client")->insert($params);
        }
        // 返回数据
        return json(["code" => 0, "msg" => "操作は成功しました"]);
    }

    /**
     * 文件导入
     */
    public function fileSave()
    {
        set_time_limit(0);
        $params = input("post.");
        $module_id = isset($params["module_id"]) ? $params["module_id"] : 0;
        $industry_id = isset($params["industry_id"]) ? $params["industry_id"] : 0;
        $class_id = isset($params["class_id"]) ? $params["class_id"] : 0;
        $file_path = isset($params["file_path"]) ? $params["file_path"] : '';
        if ($industry_id > 0 && $class_id > 0 && !empty($file_path)) {
            $o_data = db("client")->where(['industry_id'=>$industry_id,'class_id'=>$class_id,'status'=>1])->select();
            $files = $info = pathinfo($file_path);
            $extension = $files['extension'];
            $obj_phpexcel = new PHPExcel();
            if ($extension == 'xlsx') {
                $objReader = \PHPExcel_IOFactory::createReader('Excel2007');
            } else {
                $objReader = \PHPExcel_IOFactory::createReader('Excel5');
            }
            $objData = $objReader->load('.' . $file_path, $encode = 'utf-8');
            $excel_array = $objData->getsheet(0)->toArray();

            if(count($excel_array) > 1) {
                $data = self::setExcelData($excel_array, $module_id, $industry_id, $class_id);
                $newData = self::setTrueData($o_data, $data);
                $res = db("client")->insertAll($newData);
                if ($res) {
                    return json(["code" => 0, "msg" => "操作は成功しました"]);
                } else {
                    return json(["code" => 1, "msg" => "操作が失敗しました。パラメータがありません"]);
                }
            } else {
                return json(["code" => 1, "msg" => "ファイルの中身は空です"]);
            }
        } else {
            return json(["code" => 1, "msg" => "パラメータエラーです"]);
        }
    }

    /**
     * 重组Excel数据
     */
    public static function setExcelData($excel_array, $module_id, $industry_id, $class_id)
    {
        $headerArr = $excel_array[0];
        $header = [];
        $data = [];
        if (in_array("company", $headerArr)) {
            $header = [
                "title" => ["company", "tel", "address", "url", "contact"],
                "field" => ["title", "tel", "address", "web_url", "content"],
                "key" => []
            ];
        } else {
            $header = [
                "title" => ["社名", "電話番号", "所在地", "ウェブサイト", "備考"],
                "field" => ["title", "tel", "address", "web_url", "content"],
                "key" => []
            ];
        }

        for ($j = 0; $j < count($header["title"]); $j++) {
            for ($i = 0; $i < count($headerArr); $i++) {
                if ($headerArr[$i] == $header['title'][$j]) {
                    $header["key"][] = $i;
                }
            }
        }

        for ($i = 1; $i < count($excel_array); $i++) {
            $setData = [
                "module_id" => $module_id,
                "industry_id" => $industry_id,
                "class_id" => $class_id,
                "create_time" => date("Y-m-d H:i:s")
            ];
            for ($j = 0; $j < count($header["key"]); $j++) {
                $setData[$header['field'][$j]] = $excel_array[$i][$header['key'][$j]];
            }
            $data[] = $setData;
        }

        return $data;
    }

    /**
     * 比对重复数据
     */
    public static function setTrueData($odata, $data)
    {
        $returnData = [];
        foreach($data as $key => $val) {
            $is_true = true;
            foreach($odata as $vals) {
                if ($val["title"] == $vals["title"] && $val["address"] == $vals["address"] && $val["web_url"] == $vals["web_url"]) {
                    $is_true = false;
                    break;
                }
            }
            if ($is_true) {
                $returnData[] = $data[$key];
            }
        }
        return $returnData;
    }

    /**
     * 字段保存
     */
    public function inputChange()
    {
        // 获取参数
        $params = input("post.");
        // 验证参数
        if (isset($params['id']) && !empty($params['id'])) {
            // 更新数据
            $params["update_time"] = date("Y-m-d H:i:s");
            db("client")->update($params);
            // 定义返回数据
            $arr = ["code" => 0, "msg" => "操作は成功しました"];
        } else {
            // 定义返回数据
            $arr = ["code" => 1, "msg" => "操作が失敗しました。パラメータがありません"];
        }
        return json($arr);
    }

    /**
     * 状态保存
     */
    public function setSaleState()
    {
        // 获取参数
        $params = input("post.");
        // 验证参数
        if (isset($params['id']) && !empty($params['id'])) {
            // 更新数据
            $datas = [
                "client_id"  => $params["id"],
                "sale_state" => $params["set_sale_state"],
                "create_time" => date("Y-m-d H:i:s")
            ];
            $res = db("client_log")->insert($datas);
            if ($res) {
                $data = [
                    "id" => $params["id"],
                    "sale_state" => $params["set_sale_state"]
                ];
                db("client")->update($data);
                // 定义返回数据
                $arr = ["code" => 0, "msg" => "操作は成功しました"];
            } else {
                $arr = ["code" => 1, "msg" => "操作が失敗しました。パラメータがありません"];
            }
        } else {
            // 定义返回数据
            $arr = ["code" => 1, "msg" => "操作が失敗しました。パラメータがありません"];
        }
        return json($arr);
    }

    /**
     * 删除数据
     */
    public function delete()
    {
        // 获取参数
        $params = input("post.");
        // 验证参数
        if (isset($params["ids"]) && !empty($params["ids"])) {
            // 定义更新条件
            $where["id"] = array("in", $params["ids"]);
            // 更新数据
            $params["delete_time"] = date("Y-m-d H:i:s");
            db("client")->whereIn('id', $params["ids"])->update(["status" => 2]);
            // 定义返回数据
            $arr = ["code" => 0, "msg" => "正常に削除されました"];
        } else {
            // 定义返回数据
            $arr = ["code" => 1, "msg" => "操作が失敗しました。パラメータがありません"];
        }
        return json($arr);
    }
}
